import type { PatentIdentifier } from '@/types'
import type {
  Expression, Node, Visitor, Ast,
} from '@/types/retrieval-sql'
import createVisitor from '@/utils/retrieval-sql/core/transformer/visitor'

// 遍历器 参数：ast 和 visitor
function traverser(ast: Ast, visitor: Visitor) {
  // 定义方法 traverseArray
  // 用于遍历 AST节点数组，对数组中每个元素调用 traverseNode 方法。
  function traverseArray(array: Node[], parent: Expression) {
    array.forEach((child) => {
      // eslint-disable-next-line no-use-before-define
      traverseNode(child, parent)
    })
  }

  // 定义方法 traverseNode
  // 用于处理每个 AST 节点，接受一个 node 和它的父节点 parent 作为参数
  function traverseNode(node: Node, parent: Expression | null) {
    // 获取 visitor 上对应方法的对象
    const methods = visitor[node.type]
    // 获取 visitor 的 enter 方法，处理操作当前 node
    if (methods) {
      methods(node as any, parent as any)
    }

    switch (node.type) {
      case 'Expression':
        if (node.variant === 'list') {
          traverseArray(node.expression!, node)
        } else {
          traverseNode(node.left!, node)
          traverseNode(node.right!, node)
        }
        break
      case 'Identifier':
      case 'Literal':
        break
        // 当遇到无法识别的字符，抛出错误提示，并退出
      default:
        throw new TypeError((node as any).type)
    }
  }
  // 首次执行，开始遍历
  traverseNode(ast, null)
}

export default function transformer(ast: Ast, identifiers: PatentIdentifier[]) {
  traverser(ast, createVisitor(identifiers))
  return ast
}
